{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "sought-acrobat",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.metrics import roc_auc_score,roc_curve,auc\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn import metrics\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "import numpy as np\n",
    "import random\n",
    "import math"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "stopped-portuguese",
   "metadata": {},
   "source": [
    "## 加载数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "inclusive-partnership",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>obs_mth</th>\n",
       "      <th>bad_ind</th>\n",
       "      <th>uid</th>\n",
       "      <th>td_score</th>\n",
       "      <th>jxl_score</th>\n",
       "      <th>mj_score</th>\n",
       "      <th>rh_score</th>\n",
       "      <th>zzc_score</th>\n",
       "      <th>zcx_score</th>\n",
       "      <th>person_info</th>\n",
       "      <th>finance_info</th>\n",
       "      <th>credit_info</th>\n",
       "      <th>act_info</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2018-10-31</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A10000005</td>\n",
       "      <td>0.675349</td>\n",
       "      <td>0.144072</td>\n",
       "      <td>0.186899</td>\n",
       "      <td>0.483640</td>\n",
       "      <td>0.928328</td>\n",
       "      <td>0.369644</td>\n",
       "      <td>-0.322581</td>\n",
       "      <td>0.023810</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.217949</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2018-07-31</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A1000002</td>\n",
       "      <td>0.825269</td>\n",
       "      <td>0.398688</td>\n",
       "      <td>0.139396</td>\n",
       "      <td>0.843725</td>\n",
       "      <td>0.605194</td>\n",
       "      <td>0.406122</td>\n",
       "      <td>-0.128677</td>\n",
       "      <td>0.023810</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.423077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2018-09-30</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A1000011</td>\n",
       "      <td>0.315406</td>\n",
       "      <td>0.629745</td>\n",
       "      <td>0.535854</td>\n",
       "      <td>0.197392</td>\n",
       "      <td>0.614416</td>\n",
       "      <td>0.320731</td>\n",
       "      <td>0.062660</td>\n",
       "      <td>0.023810</td>\n",
       "      <td>0.10</td>\n",
       "      <td>0.448718</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2018-07-31</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A10000481</td>\n",
       "      <td>0.002386</td>\n",
       "      <td>0.609360</td>\n",
       "      <td>0.366081</td>\n",
       "      <td>0.342243</td>\n",
       "      <td>0.870006</td>\n",
       "      <td>0.288692</td>\n",
       "      <td>0.078853</td>\n",
       "      <td>0.071429</td>\n",
       "      <td>0.05</td>\n",
       "      <td>0.179487</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2018-07-31</td>\n",
       "      <td>0.0</td>\n",
       "      <td>A1000069</td>\n",
       "      <td>0.406310</td>\n",
       "      <td>0.405352</td>\n",
       "      <td>0.783015</td>\n",
       "      <td>0.563953</td>\n",
       "      <td>0.715454</td>\n",
       "      <td>0.512554</td>\n",
       "      <td>-0.261014</td>\n",
       "      <td>0.023810</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.423077</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      obs_mth  bad_ind        uid  td_score  jxl_score  mj_score  rh_score  \\\n",
       "0  2018-10-31      0.0  A10000005  0.675349   0.144072  0.186899  0.483640   \n",
       "1  2018-07-31      0.0   A1000002  0.825269   0.398688  0.139396  0.843725   \n",
       "2  2018-09-30      0.0   A1000011  0.315406   0.629745  0.535854  0.197392   \n",
       "3  2018-07-31      0.0  A10000481  0.002386   0.609360  0.366081  0.342243   \n",
       "4  2018-07-31      0.0   A1000069  0.406310   0.405352  0.783015  0.563953   \n",
       "\n",
       "   zzc_score  zcx_score  person_info  finance_info  credit_info  act_info  \n",
       "0   0.928328   0.369644    -0.322581      0.023810         0.00  0.217949  \n",
       "1   0.605194   0.406122    -0.128677      0.023810         0.00  0.423077  \n",
       "2   0.614416   0.320731     0.062660      0.023810         0.10  0.448718  \n",
       "3   0.870006   0.288692     0.078853      0.071429         0.05  0.179487  \n",
       "4   0.715454   0.512554    -0.261014      0.023810         0.00  0.423077  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('Bcard.txt')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "immediate-carpet",
   "metadata": {},
   "source": [
    "- 划分测试数据和验证数据(时间外样本)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "adopted-leeds",
   "metadata": {},
   "outputs": [],
   "source": [
    "train = data[data.obs_mth != '2018-11-30'].reset_index().copy()\n",
    "val = data[data.obs_mth == '2018-11-30'].reset_index().copy()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "arabic-sperm",
   "metadata": {},
   "source": [
    "- 取出建模用到的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "strategic-brook",
   "metadata": {},
   "outputs": [],
   "source": [
    "#info结尾的是自己做的无监督系统输出的个人表现，score结尾的是收费的外部征信数据\n",
    "feature_lst = ['person_info','finance_info','credit_info','act_info','td_score','jxl_score','mj_score','rh_score']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "local-child",
   "metadata": {},
   "source": [
    "## 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "specific-maintenance",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=0.1)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = train[feature_lst]\n",
    "y = train['bad_ind']\n",
    "\n",
    "val_x =  val[feature_lst]\n",
    "val_y = val['bad_ind']\n",
    "\n",
    "lr_model = LogisticRegression(C=0.1)\n",
    "lr_model.fit(x,y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "alternative-reception",
   "metadata": {},
   "source": [
    "## 绘制ROC计算KS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ultimate-inventory",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_ks :  0.4151676259891534\n",
      "val_ks :  0.3856283523530577\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_pred = lr_model.predict_proba(x)[:,1] #取出训练集预测值\n",
    "fpr_lr_train,tpr_lr_train,_ = roc_curve(y,y_pred) #计算TPR和FPR\n",
    "train_ks = abs(fpr_lr_train - tpr_lr_train).max() #计算训练集KS\n",
    "print('train_ks : ',train_ks)\n",
    "\n",
    "y_pred = lr_model.predict_proba(val_x)[:,1] #计算验证集预测值\n",
    "fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred)   #计算验证集预测值\n",
    "val_ks = abs(fpr_lr - tpr_lr).max()         #计算验证集KS值\n",
    "print('val_ks : ',val_ks)\n",
    "\n",
    "from matplotlib import pyplot as plt\n",
    "plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR') #绘制训练集ROC\n",
    "plt.plot(fpr_lr,tpr_lr,label = 'evl LR')               #绘制验证集ROC\n",
    "plt.plot([0,1],[0,1],'k--')\n",
    "plt.xlabel('False positive rate')\n",
    "plt.ylabel('True positive rate')\n",
    "plt.title('ROC Curve')\n",
    "plt.legend(loc = 'best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "toxic-frontier",
   "metadata": {},
   "source": [
    "## 使用lightgbm进行特征筛选"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "detected-string",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Warning] min_data_in_leaf is set=6, min_child_samples=20 will be ignored. Current value: min_data_in_leaf=6\n",
      "[LightGBM] [Warning] bagging_fraction is set=0.6, subsample=1.0 will be ignored. Current value: bagging_fraction=0.6\n",
      "[LightGBM] [Warning] feature_fraction is set=0.8, colsample_bytree=1.0 will be ignored. Current value: feature_fraction=0.8\n",
      "[LightGBM] [Warning] bagging_freq is set=0, subsample_freq=0 will be ignored. Current value: bagging_freq=0\n",
      "[1]\ttraining's auc: 0.790509\tvalid_1's auc: 0.785818\n",
      "[2]\ttraining's auc: 0.801828\tvalid_1's auc: 0.791351\n",
      "[3]\ttraining's auc: 0.804934\tvalid_1's auc: 0.79404\n",
      "[4]\ttraining's auc: 0.811643\tvalid_1's auc: 0.80383\n",
      "[5]\ttraining's auc: 0.812088\tvalid_1's auc: 0.804768\n",
      "[6]\ttraining's auc: 0.819316\tvalid_1's auc: 0.805852\n",
      "[7]\ttraining's auc: 0.822285\tvalid_1's auc: 0.809526\n",
      "[8]\ttraining's auc: 0.825303\tvalid_1's auc: 0.811742\n",
      "[9]\ttraining's auc: 0.825884\tvalid_1's auc: 0.811141\n",
      "[10]\ttraining's auc: 0.827035\tvalid_1's auc: 0.811658\n",
      "[11]\ttraining's auc: 0.827486\tvalid_1's auc: 0.810881\n",
      "[12]\ttraining's auc: 0.828296\tvalid_1's auc: 0.810599\n",
      "[13]\ttraining's auc: 0.828793\tvalid_1's auc: 0.809961\n",
      "[14]\ttraining's auc: 0.830189\tvalid_1's auc: 0.810371\n",
      "[15]\ttraining's auc: 0.830516\tvalid_1's auc: 0.810961\n",
      "[16]\ttraining's auc: 0.832925\tvalid_1's auc: 0.810342\n",
      "[17]\ttraining's auc: 0.832958\tvalid_1's auc: 0.809997\n",
      "[18]\ttraining's auc: 0.833791\tvalid_1's auc: 0.810946\n",
      "[19]\ttraining's auc: 0.835088\tvalid_1's auc: 0.811165\n",
      "[20]\ttraining's auc: 0.835256\tvalid_1's auc: 0.812049\n",
      "[21]\ttraining's auc: 0.836739\tvalid_1's auc: 0.81188\n",
      "[22]\ttraining's auc: 0.838448\tvalid_1's auc: 0.812217\n",
      "[23]\ttraining's auc: 0.838992\tvalid_1's auc: 0.812342\n",
      "[24]\ttraining's auc: 0.839688\tvalid_1's auc: 0.812833\n"
     ]
    }
   ],
   "source": [
    "# lightgbm版本 3.0.0\n",
    "import lightgbm as lgb\n",
    "from sklearn.model_selection import train_test_split\n",
    "train_x,test_x,train_y,test_y = train_test_split(x,y,random_state=0,test_size=0.2)\n",
    "def  lgb_test(train_x,train_y,test_x,test_y):\n",
    "    clf =lgb.LGBMClassifier(boosting_type = 'gbdt',\n",
    "                           objective = 'binary',\n",
    "                           metric = 'auc',\n",
    "                           learning_rate = 0.1,\n",
    "                           n_estimators = 24,\n",
    "                           max_depth = 5,\n",
    "                           num_leaves = 20,\n",
    "                           max_bin = 45,\n",
    "                           min_data_in_leaf = 6,\n",
    "                           bagging_fraction = 0.6,\n",
    "                           bagging_freq = 0,\n",
    "                           feature_fraction = 0.8,\n",
    "                           )\n",
    "    clf.fit(train_x,train_y,eval_set = [(train_x,train_y),(test_x,test_y)],eval_metric = 'auc')\n",
    "    return clf,clf.best_score_['valid_1']['auc'],\n",
    "lgb_model , lgb_auc  = lgb_test(train_x,train_y,test_x,test_y)\n",
    "feature_importance = pd.DataFrame({'name':lgb_model.booster_.feature_name(),\n",
    "                                   'importance':lgb_model.feature_importances_}).sort_values(by=['importance'],ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "collect-telling",
   "metadata": {},
   "source": [
    "## 模型调优，去掉几个特征，重新建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "growing-metro",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_ks :  0.41573985983413414\n",
      "val_ks :  0.3928959732014397\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#确定新的特征\n",
    "feature_lst = ['person_info','finance_info','credit_info','act_info']\n",
    "x = train[feature_lst]\n",
    "y = train['bad_ind']\n",
    "\n",
    "val_x =  val[feature_lst]\n",
    "val_y = val['bad_ind']\n",
    "\n",
    "lr_model = LogisticRegression(C=0.1)\n",
    "lr_model.fit(x,y)\n",
    "y_pred = lr_model.predict_proba(x)[:,1]\n",
    "fpr_lr_train,tpr_lr_train,_ = roc_curve(y,y_pred)\n",
    "train_ks = abs(fpr_lr_train - tpr_lr_train).max()\n",
    "print('train_ks : ',train_ks)\n",
    "\n",
    "y_pred = lr_model.predict_proba(val_x)[:,1]\n",
    "fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred)\n",
    "val_ks = abs(fpr_lr - tpr_lr).max()\n",
    "print('val_ks : ',val_ks)\n",
    "from matplotlib import pyplot as plt\n",
    "plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR')\n",
    "plt.plot(fpr_lr,tpr_lr,label = 'evl LR')\n",
    "plt.plot([0,1],[0,1],'k--')\n",
    "plt.xlabel('False positive rate')\n",
    "plt.ylabel('True positive rate')\n",
    "plt.title('ROC Curve')\n",
    "plt.legend(loc = 'best')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "earlier-pakistan",
   "metadata": {},
   "source": [
    "## 生成报告"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "settled-graduate",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>BAD</th>\n",
       "      <th>GOOD</th>\n",
       "      <th>BAD_CNT</th>\n",
       "      <th>GOOD_CNT</th>\n",
       "      <th>BAD_PCTG</th>\n",
       "      <th>BADRATE</th>\n",
       "      <th>KS</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>num</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>69</td>\n",
       "      <td>730</td>\n",
       "      <td>69</td>\n",
       "      <td>730</td>\n",
       "      <td>0.210</td>\n",
       "      <td>0.086</td>\n",
       "      <td>0.164</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>749</td>\n",
       "      <td>119</td>\n",
       "      <td>1479</td>\n",
       "      <td>0.363</td>\n",
       "      <td>0.063</td>\n",
       "      <td>0.268</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>35</td>\n",
       "      <td>764</td>\n",
       "      <td>154</td>\n",
       "      <td>2243</td>\n",
       "      <td>0.470</td>\n",
       "      <td>0.044</td>\n",
       "      <td>0.326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>31</td>\n",
       "      <td>767</td>\n",
       "      <td>185</td>\n",
       "      <td>3010</td>\n",
       "      <td>0.564</td>\n",
       "      <td>0.039</td>\n",
       "      <td>0.372</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>19</td>\n",
       "      <td>780</td>\n",
       "      <td>204</td>\n",
       "      <td>3790</td>\n",
       "      <td>0.622</td>\n",
       "      <td>0.024</td>\n",
       "      <td>0.380</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>18</td>\n",
       "      <td>781</td>\n",
       "      <td>222</td>\n",
       "      <td>4571</td>\n",
       "      <td>0.677</td>\n",
       "      <td>0.023</td>\n",
       "      <td>0.385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>15</td>\n",
       "      <td>783</td>\n",
       "      <td>237</td>\n",
       "      <td>5354</td>\n",
       "      <td>0.723</td>\n",
       "      <td>0.019</td>\n",
       "      <td>0.380</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>14</td>\n",
       "      <td>785</td>\n",
       "      <td>251</td>\n",
       "      <td>6139</td>\n",
       "      <td>0.765</td>\n",
       "      <td>0.018</td>\n",
       "      <td>0.373</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>17</td>\n",
       "      <td>782</td>\n",
       "      <td>268</td>\n",
       "      <td>6921</td>\n",
       "      <td>0.817</td>\n",
       "      <td>0.021</td>\n",
       "      <td>0.375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>6</td>\n",
       "      <td>793</td>\n",
       "      <td>274</td>\n",
       "      <td>7714</td>\n",
       "      <td>0.835</td>\n",
       "      <td>0.008</td>\n",
       "      <td>0.342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>8</td>\n",
       "      <td>790</td>\n",
       "      <td>282</td>\n",
       "      <td>8504</td>\n",
       "      <td>0.860</td>\n",
       "      <td>0.010</td>\n",
       "      <td>0.316</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>6</td>\n",
       "      <td>793</td>\n",
       "      <td>288</td>\n",
       "      <td>9297</td>\n",
       "      <td>0.878</td>\n",
       "      <td>0.008</td>\n",
       "      <td>0.284</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>7</td>\n",
       "      <td>792</td>\n",
       "      <td>295</td>\n",
       "      <td>10089</td>\n",
       "      <td>0.899</td>\n",
       "      <td>0.009</td>\n",
       "      <td>0.255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>10</td>\n",
       "      <td>788</td>\n",
       "      <td>305</td>\n",
       "      <td>10877</td>\n",
       "      <td>0.930</td>\n",
       "      <td>0.013</td>\n",
       "      <td>0.235</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>7</td>\n",
       "      <td>792</td>\n",
       "      <td>312</td>\n",
       "      <td>11669</td>\n",
       "      <td>0.951</td>\n",
       "      <td>0.009</td>\n",
       "      <td>0.205</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>5</td>\n",
       "      <td>794</td>\n",
       "      <td>317</td>\n",
       "      <td>12463</td>\n",
       "      <td>0.966</td>\n",
       "      <td>0.006</td>\n",
       "      <td>0.170</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>4</td>\n",
       "      <td>794</td>\n",
       "      <td>321</td>\n",
       "      <td>13257</td>\n",
       "      <td>0.979</td>\n",
       "      <td>0.005</td>\n",
       "      <td>0.131</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>4</td>\n",
       "      <td>795</td>\n",
       "      <td>325</td>\n",
       "      <td>14052</td>\n",
       "      <td>0.991</td>\n",
       "      <td>0.005</td>\n",
       "      <td>0.093</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>1</td>\n",
       "      <td>798</td>\n",
       "      <td>326</td>\n",
       "      <td>14850</td>\n",
       "      <td>0.994</td>\n",
       "      <td>0.001</td>\n",
       "      <td>0.045</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>2</td>\n",
       "      <td>797</td>\n",
       "      <td>328</td>\n",
       "      <td>15647</td>\n",
       "      <td>1.000</td>\n",
       "      <td>0.003</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     BAD  GOOD  BAD_CNT  GOOD_CNT  BAD_PCTG  BADRATE     KS\n",
       "num                                                        \n",
       "0     69   730       69       730     0.210    0.086  0.164\n",
       "1     50   749      119      1479     0.363    0.063  0.268\n",
       "2     35   764      154      2243     0.470    0.044  0.326\n",
       "3     31   767      185      3010     0.564    0.039  0.372\n",
       "4     19   780      204      3790     0.622    0.024  0.380\n",
       "5     18   781      222      4571     0.677    0.023  0.385\n",
       "6     15   783      237      5354     0.723    0.019  0.380\n",
       "7     14   785      251      6139     0.765    0.018  0.373\n",
       "8     17   782      268      6921     0.817    0.021  0.375\n",
       "9      6   793      274      7714     0.835    0.008  0.342\n",
       "10     8   790      282      8504     0.860    0.010  0.316\n",
       "11     6   793      288      9297     0.878    0.008  0.284\n",
       "12     7   792      295     10089     0.899    0.009  0.255\n",
       "13    10   788      305     10877     0.930    0.013  0.235\n",
       "14     7   792      312     11669     0.951    0.009  0.205\n",
       "15     5   794      317     12463     0.966    0.006  0.170\n",
       "16     4   794      321     13257     0.979    0.005  0.131\n",
       "17     4   795      325     14052     0.991    0.005  0.093\n",
       "18     1   798      326     14850     0.994    0.001  0.045\n",
       "19     2   797      328     15647     1.000    0.003  0.000"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#准备数据\n",
    "bins = 20\n",
    "temp_ = pd.DataFrame() #创建空白DataFrame\n",
    "temp_['bad_rate_predict'] = lr_model.predict_proba(val_x)[:,1] # 预测结果（坏人概率）\n",
    "temp_['real_bad'] = val_y # 真实结果\n",
    "temp_ = temp_.sort_values('bad_rate_predict',ascending = False)#按照预测坏人概率降序排列\n",
    "temp_['num'] = [i for i in range(temp_.shape[0])] #添加序号列，用于分组\n",
    "temp_['num'] = pd.cut(temp_.num,bins = bins,labels = [i for i in range(bins)])#分成20组，为每组添加组号\n",
    "\n",
    "#创建报告\n",
    "report = pd.DataFrame()#创建空白DataFrame\n",
    "#计算每一组坏人数量\n",
    "report['BAD'] = temp_.groupby('num').real_bad.sum().astype(int)\n",
    "#计算每一组好人数量\n",
    "report['GOOD'] = temp_.groupby('num').real_bad.count().astype(int)-report['BAD']\n",
    "#累计求和坏人数量\n",
    "report['BAD_CNT'] = report['BAD'].cumsum()\n",
    "#累计求和好人数量\n",
    "report['GOOD_CNT'] = report['GOOD'].cumsum()\n",
    "good_total = report.GOOD_CNT.max()\n",
    "bad_total = report.BAD_CNT.max()\n",
    "#计算到当前组坏人比例（占所有坏人比例）\n",
    "report['BAD_PCTG'] = round(report.BAD_CNT/bad_total,3)\n",
    "#计算当前组坏人概率\n",
    "report['BADRATE'] =report.apply(lambda x: round(x.BAD/(x.BAD+x.GOOD),3),axis = 1)\n",
    "#计算KS值\n",
    "def cal_ks(x):\n",
    "  #当前箱累计坏人数量/总坏人数量  - 当前箱累计好人数量/好人数量\n",
    "    ks = (x.BAD_CNT/bad_total)-(x.GOOD_CNT/good_total)\n",
    "    return round(math.fabs(ks),3)\n",
    "report['KS'] = report.apply(cal_ks,axis = 1)\n",
    "report"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "comic-tournament",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/Users/vincent/Movies/render.html'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from pyecharts.charts import *\n",
    "from pyecharts import options as opts\n",
    "from pylab import *\n",
    "mpl.rcParams['font.sans-serif'] = ['SimHei']\n",
    "np.set_printoptions(suppress=True)\n",
    "pd.set_option('display.unicode.ambiguous_as_wide', True)\n",
    "pd.set_option('display.unicode.east_asian_width', True)\n",
    "line = (\n",
    "\n",
    "    Line()\n",
    "    .add_xaxis(report.index.values.tolist())\n",
    "    .add_yaxis(\n",
    "        \"分组坏人占比\",\n",
    "        list(report.BADRATE),\n",
    "        yaxis_index=0,\n",
    "        color=\"red\",\n",
    "    )\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title=\"评分卡模型表现\"),\n",
    "    )\n",
    "    .extend_axis(\n",
    "        yaxis=opts.AxisOpts(\n",
    "            name=\"KS值\",\n",
    "            type_=\"value\",\n",
    "            min_=0,\n",
    "            max_=0.5,\n",
    "            position=\"right\",\n",
    "            axisline_opts=opts.AxisLineOpts(\n",
    "                linestyle_opts=opts.LineStyleOpts(color=\"red\")\n",
    "            ),\n",
    "            axislabel_opts=opts.LabelOpts(formatter=\"{value}\"),\n",
    "        )\n",
    "\n",
    "    )\n",
    "    .add_yaxis(\n",
    "        \"KS\",\n",
    "        list(report['KS']),\n",
    "        yaxis_index=1,\n",
    "        color=\"blue\",\n",
    "        label_opts=opts.LabelOpts(is_show=False),\n",
    "    )\n",
    ")\n",
    "line.render()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {},
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
